<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>this练习题</title>
    </head>
    <body>
        <script>
            //T1.
            // function fun() {
            //     console.log(this.s);
            // }
            // var obj = {
            //     s: 1,
            //     f: fun,
            // };
            // var s = 2;
            // obj.f();
            // obj调用，此时this指向obj 输出1

            //T2.
            // function fun() {
            //     console.log(this.s);
            //     var obj = {
            //         s: 1,
            //         f: fun,
            //     };
            // }
            // var s = 2;
            // fun();
            // window调用函数， this指向window 输出2

            // //T3.
            // var A = {
            //     name: "jmq",
            //     f: function () {
            //         console.log(this.name);
            //     },
            // };
            // var B = {
            //     name: "syc",
            // };
            // B.f = A.f;
            // A.f(); // A调用f() 此时this指向A，所以输出jmq
            // B.f(); // 首先，为B添加方法了f(), 此时B调用自身方法f() 输出syc

            // //T4.
            // function fo() {
            //     console.log(this.a);
            // }
            // var o1 = {
            //     a: 3,
            // };
            // var o2 = {
            //     a: 6,
            // };
            // var a = 9;
            // o1.f = fo;
            // console.log(o1); // 上面代码，为o1添加方法f，所以输出为{a: 6, f: fo}
            // o2.f = o1.f;
            // o1.f(); // 输出什么？o1调用f() this指向o1， 输出3
            // o2.f(); // 输出什么？o2调用f() this指向o2， 输出6

            ////T5.
            // function foo() {
            //     console.log(this.a);
            // }
            // var obj2 = {
            //     a: 2,
            //     fn: foo,
            // };
            // var obj1 = {
            //     a: 1,
            //     o1: obj2,
            // };
            // obj1.o1.fn(); // 输出的是啥？ 实际调用fn()的为o1，所以this指向o1，输出2

            // //T6.
            // var a = 10;
            // var obj = {
            //     a: 120,
            //     method: function () {
            //         var bar = function () {
            //             console.log(this.a); // 输出什么？虽然是在method方法中申明和调用，但实际上的调用函数的window，所以输出10
            //         };
            //         bar();
            //         return this.a; // 输出什么？obj调用自身方法，this指向obj，返回120
            //     },
            // };
            // console.log(obj.method());

            //T7.
            // var fullName = "language";
            // var obj = {
            //     fullName: "javascript",
            //     prop: {
            //         getFullName: function () {
            //             return this.fullName;
            //         },
            //     },
            // };
            // console.log(obj.prop.getFullName()); // 这里输出什么？ undefined 这行代码是obj中的prop调用getFullName()方法，this指向prop，而在prop对象中没有fullName属性， 所以输出undefined
            // var test = obj.prop.getFullName;
            // console.log(test()); // 这里输出什么 language

            // //T8.
            // function fn() {
            //     console.log(this);
            // }
            // setInterval(fn, 1000); // 这里打印啥？此时定时器中调用函数，this指向window 输出window

            // //T9.
            // var k = {
            //     a: 1,
            //     sing: function () {
            //         console.log(this);
            //     },
            // };
            // setTimeout(k.sing(), 1000); // 这里打印的是啥？ 打印k对象，对象k调用sing()方法， this指向k，所以打印k对象
            //T10.
            // var value = 8;
            // var obj = {
            //     value: 10,
            //     fn: () => {
            //         console.log(this.value); //打印什么 箭头函数中没有this，在这里的this指向是上一个函数作用域或者全局作用域 所以this指向window， 输出8
            //     },
            // };
            // obj.fn();
        </script>
    </body>
</html>
